# -*- coding:utf-8 -*-
import os
import sys

from django.db.backends import BaseDatabaseClient


# mysql db的client类。继承自公共的抽象类BaseDatabaseClient
class DatabaseClient(BaseDatabaseClient):
    executable_name = 'mysql'               # 执行程序名

    def runshell(self):
        settings_dict = self.connection.settings_dict
        args = [self.executable_name]                                               # 'mysql'
        db = settings_dict['OPTIONS'].get('db', settings_dict['NAME'])
        user = settings_dict['OPTIONS'].get('user', settings_dict['USER'])
        passwd = settings_dict['OPTIONS'].get('passwd', settings_dict['PASSWORD'])
        host = settings_dict['OPTIONS'].get('host', settings_dict['HOST'])
        port = settings_dict['OPTIONS'].get('port', settings_dict['PORT'])
        defaults_file = settings_dict['OPTIONS'].get('read_default_file')
        # Seems to be no good way to set sql_mode with CLI.

        if defaults_file:                                                           # "--defaults-file=%s" % defaults_file
            args += ["--defaults-file=%s" % defaults_file]
        if user:                                                                    # "--user=%s" % user
            args += ["--user=%s" % user]
        if passwd:                                                                  # "--password=%s" % passwd
            args += ["--password=%s" % passwd]
        if host:
            if '/' in host:
                args += ["--socket=%s" % host]
            else:
                args += ["--host=%s" % host]
        if port:
            args += ["--port=%s" % port]                                            # "--port=%s" % port
        if db:
            args += [db]                                                            # "db_name"

        # args是一个list类型，['mysql', ...]
        if os.name == 'nt':
            sys.exit(os.system(" ".join(args)))
        else:
            os.execvp(self.executable_name, args)

# 这里有个知识点科普下：
# python退出程序的方式有两种：os._exit()和sys.exit()
# os._exit()：直接退出，其后代码不执行
# sys.exit()：引发一个SystemExit异常，若没有捕获这个异常，python解释器会直接退出；
#             捕获这个异常可以做一些额外的清理工作。0为正常退出；其他值为不正常（1~127），抛出事件可供捕获；

